#include"myFileBuffer.h"

_FILE* fopen_(const char*path_name,const char*mode){

  int flags=0;
  int defaultMode=0666;

  //判断不同的打开方式设置flags 这里举例w a r
  if(strcmp(mode,"r")==0)
  {
    flags=O_RDONLY;

  }
  else if(strcmp(mode,"w")==0)
  {
    flags=O_WRONLY|O_CREAT|O_TRUNC;
  }
  else if(strcmp(mode,"a")==0)
  {
    flags=O_WRONLY|O_CREAT|O_APPEND;
  }
  else{

  }

  //根据不同的打开方式，打开文件
  int fd=0;
  if(flags&O_RDONLY)
  {
    fd=open(path_name,flags);
  }
  else{
    fd=open(path_name,flags,defaultMode);
  }

  //printf("我的fd是 %d\n",fd);
  //如果打开失败
  if(fd<0)
  {
    const char* err=strerror(errno);
    write(2,err,strlen(err));
    return NULL;
  }

  //创建文件缓冲区并对其初始化
  _FILE*fp=(_FILE*)malloc(sizeof (_FILE));
  assert(fp);
  fp->flags=SYNC_LINE;//默认设置成行刷新
  fp->fileno=fd;
  fp->cap=SIZE;
  fp->size=0;
  memset(fp->buffer,0,SIZE);//初始化文件缓冲区

  return fp;
}

void fwrite_(const void *ptr,int num,_FILE *fp)
{
  //写到文件缓冲区中
  memcpy(fp->buffer+fp->size,ptr,num);//注意这里的起始地址
  fp->size+=num;

//  printf("fd->fileno是 %d\n",fp->fileno);

  //判断是否刷新
  if(fp->flags&SYNC_NOW)
  {
    //立即刷新
    write(fp->fileno,fp->buffer,fp->size);
    fp->size=0;
  }
  else if(fp->flags&SYNC_FULL)
  {
    //等到缓冲区写满再刷新
    if(fp->size==fp->cap)
    {
      write(fp->fileno,fp->buffer,fp->size);
      fp->size=0;
    }
  }
  else if(fp->flags&SYNC_LINE)
  {
    if(fp->buffer[fp->size-1]=='\n')
    {
   //   printf("这里是行缓冲\n");

      write(fp->fileno,fp->buffer,fp->size);
      fp->size=0;
      //把_FILE缓冲区的内容拷贝到内核缓冲区中
    } 
  }
  else{

  }

}
void fclose_(_FILE* fp)
{
  //文件退出前会强制刷新
  fflush_(fp);
  close(fp->fileno);
}
void fflush_(_FILE *fp)
{
  //强制刷新
  if(fp->size>0)
  {
    write(fp->fileno,fp->buffer,fp->size);
    fp->size=0;
  }
}
